package com.qf.boot2302.controller;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
import com.baomidou.kaptcha.Kaptcha;
import com.baomidou.kaptcha.exception.KaptchaTimeoutException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.qf.boot2302.entity.Student;
import com.qf.boot2302.vo.ResultVo;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;

//@Controller
@RestController  // 加这个注解，相当于所有的方法前面都添加了 @ResponseBody
@RequestMapping("/login")
@Slf4j  // simple logging facade for java
public class LoginController {



    @Autowired
    Kaptcha kaptcha;

    @Value("${qf.kapchar.timeout}")
    private Integer timeout;


    /**
     * 方案三
     * 使用 String接收post请求中的josn字符串，然后手动转换
     *
     * @param student
     * @return
     * @throws JsonProcessingException
     */
    @RequestMapping("/test3")
    public ResultVo test3(@RequestBody String student) throws JsonProcessingException {


        log.info("入参为:student={}",student);
        // json String ----> Java对象
        ObjectMapper objectMapper = new ObjectMapper();
        Student student1 = objectMapper.readValue(student, Student.class);
        System.out.println(student1);

        return ResultVo.ok(1, "ok", student1);
    }

    /**
     * 方案二
     * 使用Hashmap接收post请求体中的josn数据
     * @param student
     * @return
     */
    @RequestMapping("/test2")
    public ResultVo test2(@RequestBody HashMap<String,Object> student){
        log.info("入参为:student={}",student);
        return ResultVo.ok(1, "ok", student);
    }

    /**
     * 如何接收post请求体中的json数据
     * 方案一 （推荐）
     * 使用@RequestBody 后面跟上与json字段匹配的java对象即可
     * 注意：需要发送post请求，并且在请求体中放入json
     *
     * 面试题 ：
     * @RequestBody 和 @ResponseBody 的区别是什么？
     * @RequestBody 指的是从请求体中获取数据（通常是post请求），springboot中默认把请求体中的数据按照json格式转换成java对象
     * @ResponseBody 指的是响应体中存放的是数据，默认是json数据。如果使用@Controller注解的时候，需要某个方法返回数据
     * 而不是返回页面，需要给该方法添加这个注解。如果使用了@RestController，则无需在添加这个注解了。
     *
     * @param student
     * @return
     */
    @RequestMapping("/test1")
    public ResultVo test1(@RequestBody Student student){
        log.info("入参为:student={}",student);
        return ResultVo.ok(1, "ok", student);
    }

    @PostMapping("/dologin")
//    @ResponseBody
    public ResultVo dologin(@RequestParam("username") String username
            ,@RequestParam("password") String password
            ,@RequestParam("captcha")  String captcha){
        log.info("入参为:username={},password={},captcha={}",username,password,captcha);
        // 校验验证码是否正确
        boolean flag = false;
        try {
            flag = kaptcha.validate(captcha,timeout);
        } catch (KaptchaTimeoutException e) {
            return ResultVo.error(-1, "验证码过期了");
        }
        catch (Exception e) {
            e.printStackTrace();
            return ResultVo.error(-1, "验证码错误");
        }
        log.info("验证码校验结果为,flag={}",flag);

        // 判断用户名密码是否正确
        if (username.equals("luffy")&&password.equals("123456")){
            log.info("用户{}登录成功了",username);
            return ResultVo.ok(1, "ok",null);
        }else {
            log.info("用户{}登录失败了",username);
            return ResultVo.error(-1, "登录失败");
        }

    }

    @GetMapping("/kapchar")
    public void kapchar(){
        kaptcha.render();
    }

    @ResponseBody  // 代表返回的不是视图，而是数据
    @RequestMapping("/validate")
    public ResultVo validate(@RequestParam("code") String code){
        log.info("入参为:code={}",code);
        boolean flag = false;
        try {
            flag = kaptcha.validate(code,timeout);
        } catch (KaptchaTimeoutException e) {
            return ResultVo.error(-1, "验证码过期了");
        }
        catch (Exception e) {
            e.printStackTrace();
            return ResultVo.error(-1, "验证码错误");
        }
        log.info("验证码校验结果为,flag={}",flag);

        return ResultVo.ok(1,"ok",flag);
    }


}
